Bingo, Computer Graphics & Game Developer

Unidirectional Path Tracing 2

Deprecated(2017.03.30)

对于Unidirectional Path Tracing的理解是建立在Path Tracing之上

本文用于记录当前阶段对于Path Tracing的理解。此笔记的问题来源于,对于Path Tracing使用Direct Lighting的疑惑。

很多教材上提到了渲染方程

Lo(p,wo=Le(p,wo)+2πfr(p,wi,wo)Li(p,wi)cosθidωiL_o(p,\vec{w_o}=L_e(p,\vec{w_o})+\int_{2\pi}f_r(p,\vec{w_i},\vec{w_o})L_i(p,\vec{w_i})cos\theta_i d\omega_i

然后紧接着说到,我们将此方程改写成直接光照部分和间接光照部分,比如Advanced Global Illumination,问题出在,当真正遇到代码实现的时候,压根找不到间接光的部分,不论是BDPT还是PT都无法直观的理解到间接光的部分。或者说不清楚间接光在代码中的体现。


下图是帮助理解的核心

关键部分就是间接光照 = 反射光照,这从根本上解释了间接光照的含义就是从其他位置处反射的光照,而非从光源上。

假定所有表面都不自发光,也就是Le(p,wi)=0L_e(p,\vec{w_i})=0,那么定义X位置处上的入射辐射度为LxL_x,直接光照部分记为DxD_x,间接光照/反射光照部分记为RxR_x,BRDF项记为frxf_{rx}

Lx=frX(DX+RX)=frX(DX+frA(DA+RA))=frX(DX+frA(DA+frB(DB+RB)))=frX(DX+frA(DA+frB(DB+fri(...))))
\begin{array}{l}
L_x &=& f_{rX}(D_X+R_X)
\ &=& f_{rX}
(D_X+f_{rA}(D_A+R_A))
\ &=& f_{rX}
(D_X+f_{rA}(D_A+f_{rB}(D_B+R_B)))
\ &=& f_{rX}(D_X+f_{rA}(D_A+f_{rB}(D_B+f_{ri}(…))))
\end{array}

也就是

Lo(p,wo)=2πfr(p,wi,wo)(Le(rc(p,wi,wi)+Lr(rc(p,wi),wi)))cosθidωiL_o(p,\vec{w_o})=\int_{2\pi}f_r(p,\vec{w_i},\vec{w_o})(Le(rc(p,\vec{w_i},-\vec{w_i})+Lr(rc(p,\vec{w_i}),-\vec{w_i})))cos\theta_i d\omega_i

这里LeL_e项表示emitted radiance,因为其他表面没有自发光项,因此就是光源部分的辐射度贡献,即直接光照direct illumination部分;LrL_r项表示reflected radiance,也就是间接光照indirect ilumination。

根据无穷积分的定义,也可以改写为

Lo(p,wo)=2πfr(p,wi,wo)Le(rc(p,wi,wi)cosθidωi+2πfr(p,wi,wo)Lr(rc(p,wi),wi)cosθicosθpp2V(p,p)dA
\begin{array}{l}
L_o(p,\vec{w_o}) &=& \int_{2\pi}f_r(p,\vec{w_i},\vec{w_o})Le(rc(p,\vec{w_i},-\vec{w_i})cos\theta_i d\omega_i
\ &+& \int_{2\pi}f_r(p,\vec{w_i},\vec{w_o})Lr(rc(p,\vec{w_i}),-\vec{w_i})\frac{cos\theta_i cos\theta'}{||p'-p||^2}V(p,p')dA
\end{array}

右边的V(p,p)V(p',p)项就是shadowRay计算是否可视的结果


所谓的最简单的递归形式的Path Tracing本质上是对渲染方程的另一种解读,可以想象有以下光路

假定光路上任意点pip_iBRDF(p)cosθiBRDF(p)cos\theta_i乘积定义为QiQ_i,若光源上出射辐射度为LiL_i

那么Lo(p,wo)=LiQDQCQBQAL_o(p,\vec{w_o})=L_i Q_D Q_C Q_B Q_A

回想伪代码实现

for i : spp

    new ray()

    Li += li(ray, scene) / spp

end

等价于

Lo(p,wi,wo)=(LiQDQCQBQA+LiQEQCFBQG+LiQHQI...)1spp
\begin{array}{l}
L_o(p,\vec{w_i},\vec{w_o}) &=& (LiQ_DQ_CQ_BQ_A
\ &+& LiQ_EQ_CF_BQ_G
\ &+& LiQ_HQ_I…)
\ &*& \frac{1}{spp}
\end{array}

这一计算式本身就是2πfr(p,wi,wo)Li(p,wi)cosθidwi\int_{2\pi}f_r(p,\vec{w_i},\vec{w_o})L_i(p,\vec{w_i})cos\theta_idw_i的蒙特卡洛近似实现了


结论

本身递归形式和增量循环形式的Path tracing本身都是一种渲染方程的实现方式,并无差错之分。但前者的问题在与光路击中光源的概率太低的时候,比如场景中只有点光源时那么结果会是一片黑。因此在实现效果上考虑了直接光采样的Path Tracing会更胜一筹。